# 函数
# 计算圆的周长 2Πr

PI = 3.14159
r = 1
print(2 * PI * r)

r = 2
print(2 * PI * r)

r = 3
print(2 * PI * r)


# 函数
# 代码的集合
# 这些代码 都是会经常用到的
# 使用函数的目的 就是为了 让我们的代码避免重复
# def 关键字 表示定义一个函数
# zhouChang 你定义的函数名
# r 输入参数/形式参数

def zhouChang(r):
    print("传入的半径为：", r)
    print("它的周长为：", 2 * PI * r)


zhouChang(1)
zhouChang(2)
zhouChang(3)

zhouChang(6)


# 计算一个数 x 的平方
def pingFang(x):
    result = x ** 2
    return result


bianliang1 = pingFang(2)
print(bianliang1)
bianliang1 = pingFang(4)
print(bianliang1)
bianliang1 = pingFang(10)
print(bianliang1)


# 计算 x 的 a 次方
# 需要返回 x的a次方
# 函数名为 func1
# 例如 func1(10,3) 那么需要返回 1000
# func1(2,10) 那么需要返回 1024

def func1(x, a):
    return x ** a


print(func1(10, 3))
print(func1(2, 10))
print(func1(4, 4))


# n! 的阶乘
# 10！ = 10*（10-1）*（10-2）......

def jieCheng(n):
    sum = 1
    while n >= 1:
        sum *= n
        n = n - 1
    return sum


print(jieCheng(10))


# 递归函数
# 需要满足两个条件
# 第一个：有结束条件
# 第二个：自己调用自己
# 尽量避免使用 递归函数 容易造成 内存不够用
def jieCheng2(n):
    if n == 1:
        return 1
    return n * jieCheng2(n - 1)


print(jieCheng2(5))
# n = 5
# 第一次调用 返回 5 * (jieCheng2(5-1))
# 第二次调用 返回 5 * (4*jieCheng2(4-1))
# 第三次调用 返回 5 * (4*3*jieCheng2(3-1))
# 第四次调用 返回 5 * (4*3*2*jieCheng2(2-1))
# 第五次调用 返回 5 * (4*3*2*1)


# lambda 表达式
# 实际上是函数的简化版
# 计算 x 的 a 次方
# 需要返回 x的a次方
# 函数名为 func1
# 例如 func1(10,3) 那么需要返回 1000
# func1(2,10) 那么需要返回 1024

func2 = lambda x, a: x ** a
# 等同于
# def func2(x, a):
#     return x ** a

print(func2(10, 3))
print(func2(2, 10))
print(func2(2, 3))
print(func2(5, 5))

list1 = [(1, 5), (3, 4), (2, 7), (3, 3), (6, 0)]
list1.sort(key=lambda x:x[1])